<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <!-- 第一种 -->
  <script>
    "user strict"
    console.log(this);//如果是浏览器环境不管是否是严格模式this指向都是window对象,如果是node环境this执行的是{}

  </script>
  <!-- 第二种 是否是new绑定，
    一构造函数中没有返回对象或者函数，那么this指向这个新对象
    如果返回对象或者函数，this执行返回的对象或者函数
   -->
  <script>
    class Person{
      constructor(age){
        this.age = age
      }
    }

    // class Person{
    //   constructor(age){
    //     this.age = age
    //     let obj = {name:'zll',age:'444'}
    //     return obj
    //   }
    // }

    // class Person{
    //   constructor(age){
    //     this.age = age
    //     return ()=>{}
    //   }
    // }
    let p = new Person('2')
    console.log(p.age);
  </script>
  <!-- 谁调用它，this就指向谁 -->
  <script>
    function add() {
      console.log(this); 
    }
    add() // window中调用，所以this是window

    let obj = {
      name:'zll',
      fn:function(){
        console.log(this);
        function add() {
          console.log(this) //指向的windows，可以改造成箭头函数，或者用变量保存外部this
        }
        add()
      },
      fn2:()=>{
        console.log(this)
      }
    }
    obj.fn() // this指向obj
    let newFn = obj.fn
    newFn() // this指向window

    obj.fn2() // 箭头函数没有this是继承的父级的this，windows
    let newFn2 = obj.fn2
    newFn2() // windows

  </script>
  <script>
    
  </script>
</body>
</html>